import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws Exception {
        // 指定ip地址和端口号
        Socket s = new Socket(InetAddress.getByName("192.168.20.15"), 6666);

        Scanner sc = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String userName = sc.next();

        // 使用 可以简化 BufferedWriter
        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());

        // 启动线程接收数据并打印
        // 需要一个显示Server响应内容的线程
        new ClientThread(s).start();

        // 键盘录入
        // 支持循环写入数据, 如果写入的exit, 结束写入
        while (true) {
            System.out.println("开始聊天!");
            String msg = sc.next();
            // 每次都new一个新的对象
            UserInfo userInfo = new UserInfo();
            userInfo.setName(userName);
            userInfo.setMsg(msg);
            oos.writeObject(userInfo);

//            pw.println(msg); // 写入字符串并且换行
//            pw.flush();

            if ("exit".equals(msg)) {
                break;
            }
        }

        oos.close();// 关闭输出流, 表示数据写入Socket完成
        sc.close();
        s.close();
    }
}

/*
接收服务端的响应数据并打印
 */
class ClientThread extends Thread {
    private Socket socket;

    public ClientThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String resp = br.readLine();
                System.out.println(resp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
